<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>
    // const boy = new PlayBoy('Tom')
    // boy.sayHi().sleep(1000).play('王者').sleep(2000).play('跳一跳')
    // 输出
    // 大家好我是Tom
    // 1s 之后
    // 我在玩王者
    // 2s 之后
    // 我在玩跳一跳
    /**
     * PlayBoy 类用于创建具有链式调用和异步任务队列功能的对象
     */
    class PlayBoy{
        /**
         * 构造函数，初始化实例并启动任务队列
         * @param {string} name - 实例名称
         */
        constructor(name) {
            this.name = name
            // 任务队列，存储待执行函数
            this.queue = []
            // 异步启动任务处理器
            setTimeout(()=>{
                this.next()
            },0)
        }

        /**
         * 执行队列中的下一个任务
         */
        next(){
            // 从队列头部取出并执行任务
            if(this.queue.length > 0){
                const fn = this.queue.shift()
                fn && fn()
            }
        }

        /**
         * 添加打招呼任务到队列
         * @returns {PlayBoy} 返回实例自身以支持链式调用
         */
        sayHi(){
            const fn = function(){
                console.log('大家好，我是'+this.name)
                this.next()  // 触发下一个任务
            }.bind(this)
            this.queue.push(fn)
            return this
        }

        /**
         * 添加延时任务到队列
         * @param {number} time - 延时时间(毫秒)
         * @returns {PlayBoy} 返回实例自身以支持链式调用
         */
        sleep(time){
            const fn = function(){
                // 设置延时后触发下一个任务
                setTimeout(()=>{
                    this.next()
                },time)
            }.bind(this)
            this.queue.push(fn)
            return this
        }

        /**
         * 添加游戏任务到队列
         * @param {string} value - 游戏名称
         * @returns {PlayBoy} 返回实例自身以支持链式调用
         */
        play(value){
            const fn = function(){
                console.log('我在玩' + value)
                this.next()  // 触发下一个任务
            }.bind(this)
            this.queue.push(fn)
            return this
        }
    }


    const boy = new PlayBoy('Tom')
    boy.sayHi().sleep(1000).play('王者').sleep(2000).play('跳一跳')
</script>
</html>